package com.test.xq.customdemo.customtools;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

/**
 * Created by xq on 17/4/12.
 */


//Canvas之画布操作
// PS: 所有的画布操作都只影响后续的绘制，对之前已经绘制过的内容没有影响。
public class CustomView2 extends View {

    private Paint mPaint = new Paint();
    private int mWidth, mHeight;

    public CustomView2(Context context) {
        super(context);
    }

    public CustomView2(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        initPaint();
        skew(canvas);
    }

    //初始化画笔
    private void initPaint() {
        mPaint.setColor(Color.BLACK); //设置画笔颜色
        mPaint.setStyle(Paint.Style.FILL); //设置画笔模式为填充
        mPaint.setStrokeWidth(10f); //设置画笔的宽度为10px
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//        如果对View的宽高进行修改了，不要调用 super.onMeasure( widthMeasureSpec, heightMeasureSpec);
//        要调用 setMeasuredDimension( widthsize, heightsize); 这个函数。
//        setMeasuredDimension(widthMeasureSpec,heightMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int wifthMode = MeasureSpec.getMode(widthMeasureSpec);

        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mWidth = w;
        mHeight = h;
    }

    //translate是坐标系的移动，将画布的坐标原点移动到指定位置,可以为图形绘制选择一个合适的坐标系。
    // 请注意，位移是基于当前位置移动，而不是每次基于屏幕左上角的(0,0)点移动，
    private void translate(Canvas canvas) {
        // 在坐标原点绘制一个黑色圆形
        canvas.translate(200, 200);
        canvas.drawCircle(0, 0, 100, mPaint);

        // 在坐标原点绘制一个蓝色圆形
        mPaint.setColor(Color.BLUE);
        canvas.translate(200, 200);
        canvas.drawCircle(0, 0, 100, mPaint);
    }

    //这两个方法中前两个参数是相同的分别为x轴和y轴的缩放比例。而第二种方法比前一种多了两个参数，用来控制缩放中心位置的。
    //缩放的中心默认为坐标原点,而缩放中心轴就是坐标轴
    private void scale(Canvas canvas) {
        // 将坐标系原点移动到画布正中心
        canvas.translate((float) (mWidth/2),(float)(mHeight/2));
        RectF rectF = new RectF(0,-400,400,0); //矩形区域
        canvas.drawRect(rectF,mPaint);


        //第一种方法
        //当缩放比例为负数的时候会根据缩放中心轴进行翻转
//        canvas.scale(0.5f,0.5f);
//        mPaint.setColor(Color.BLUE);            // 绘制蓝色矩形
//        canvas.drawRect(rectF,mPaint);


        //第二种方法
        canvas.scale(0.5f,0.5f,200,0);          // 画布缩放  <-- 缩放中心向右偏移了200个单位

        mPaint.setColor(Color.BLUE);            // 绘制蓝色矩形
        canvas.drawRect(rectF,mPaint);
    }

    private void scaleDemo(Canvas canvas){
        mPaint.setStyle(Paint.Style.STROKE); //设置画笔模式为填充
        // 将坐标系原点移动到画布正中心
        canvas.translate(mWidth / 2, mHeight / 2);

        RectF rect = new RectF(-400,-400,400,400);   // 矩形区域

        for (int i=0; i<=20; i++)
        {
            canvas.scale(0.9f,0.9f);
            canvas.drawRect(rect,mPaint);
        }
    }

    //和缩放一样，第二种方法多出来的两个参数依旧是控制旋转中心点的。
    private void rotate(Canvas canvas){
        // 将坐标系原点移动到画布正中心
        canvas.translate(mWidth/2,mHeight/2);
        //矩形区域
        RectF rectF = new RectF(0,-400,400,0);
        //绘制矩形
        canvas.drawRect(rectF,mPaint);

        //第一种方法
        //旋转180度 <-- 默认旋转中心为原点
//        canvas.rotate(180);
//        mPaint.setColor(Color.BLUE);
//        canvas.drawRect(rectF,mPaint);

        //第二种方法
        canvas.rotate(180,200,0);
        mPaint.setColor(Color.BLUE);
        canvas.drawRect(rectF,mPaint);

//        好吧，旋转也是可叠加的  等于旋转了200度
//
//        canvas.rotate(180);
//        canvas.rotate(20);

    }

    private void rotateDemo(Canvas canvas){
        mPaint.setStyle(Paint.Style.STROKE);
        // 将坐标系原点移动到画布正中心
        canvas.translate(mWidth/2,mHeight/2);

        canvas.drawCircle(0,0,400,mPaint);
        canvas.drawCircle(0,0,380,mPaint);
        for (int i=0;i<=360;i+=10){
            canvas.drawLine(0,380,0,400,mPaint);
            canvas.rotate(10);
        }
    }

    private void skew(Canvas canvas){
        mPaint.setStyle(Paint.Style.STROKE);
        canvas.translate(mWidth/2,mHeight/2);
        RectF rectF = new RectF(0,0,200,200);
        canvas.drawRect(rectF,mPaint);

        // 水平错切 <- 45度
        canvas.skew(1,0);
        mPaint.setColor(Color.BLUE);
        canvas.drawRect(rectF,mPaint);
    }
}
